/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Diccionario_Interprete;

import InteracciónBD.Conection;
import java.sql.*;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * Clase que contiene un conjuno de Definition's para traducir palabras entre BBDD's.
 * @author Felipe Rachid - Javier Pérez
 */
public class Dictionary
{
    private ResultSet resultSet;
    private ResultSetMetaData resultSetMD;
    private HashMap<String, Definition> dictionary;
    
    /**********************************************************************/
    /**********************************************************************/
    /**********************************************************************/

    /**
     * @return resultSet Tabla de resultados generados por el Statement.
     */
    private ResultSet getResultSet()
    { return resultSet; }

    /**
     * @param resultSet Tabla de resultados generados por el Statement.
     */
    private void setResultSet(ResultSet resultSet)
    { this.resultSet = resultSet; }
    
    /**
     * @return resultSetMD Usado para obtener información sobre tipos 
     * y porpiedades de las columnas obtenidos en el resultSet.
     */
    private ResultSetMetaData getResultSetMD()
    { return resultSetMD; }

    /**
     * @param resultSetMD Usado para obtener información sobre tipos 
     * y porpiedades de las columnas obtenidos en el resultSet.
     */
    private void setResultSetMD(ResultSetMetaData resultSetMD)
    { this.resultSetMD = resultSetMD; }
    
    /**
     * @return  dictionary HashMap que contine las Definition´s
     * de todas las BBDD's y una identificación para cada una.
     */
    private HashMap<String, Definition> getDictionary()
    { return dictionary; }

    /**
     * @param dictionary HashMap que contine las Definition´s
     * de todas las BBDD's y una identificación para cada una.
     */
    private void setDictionary(HashMap<String, Definition> dictionary)
    { this.dictionary = dictionary; }
    
    /**********************************************************************/
    /**********************************************************************/
    /**********************************************************************/
    
    /**
     * Constructor de la clase Dictionary que incializa un HashMap con un 
     * conjunto de campos String y una Definition asociada a cada String.
     */
    public Dictionary()
    {
        try
        {
            setDictionary(new HashMap<String, Definition>());
            //Se crea la conexión.
            Conection myConection = new Conection();
            //Se abre la conexión con los datos especificos del diccionario.
            myConection.openConnection("jdbc:mysql://localhost/access_meaning", "root", "0000");
            //Se capturan todos los datos.
            setResultSet(myConection.obtainResultSet("select * from meaning"));
            //Se obtienen los metadatos de la tabla capturada.
            setResultSetMD(getResultSet().getMetaData());
            int nColumn = getResultSetMD().getColumnCount();
            //Se agregan las Definition's y su identificador.
            for(int i = 3; i <= nColumn; i++)
            {  
                Definition myDefinition = new Definition();
                getResultSet().first();
                do
                { myDefinition.addDefinition(getResultSet().getString(2), getResultSet().getString(i)); }
                while(getResultSet().next());                 
                getDictionary().put(getResultSetMD().getColumnName(i), myDefinition);
            }
            //Se cierra la conexión.
            myConection.closeConcection();
        }
        catch (Exception e) {System.err.println(e.toString());}
    }
    
    /**
     * Dado un lenguaje y una palabra genérica, devuelve su traducción.
     * @param language Un lenguaje contenido en la BBDD del Dictionary.
     * @param word Una palabra genérica de la cual se quiere su traducción.
     * @return word Una palabra traducida al leguaje especificado.
     */
    public String obtainTranslate(String language, String word)
    { return getDictionary().get(language).obtainDefinition(word); }
    
    /**
     * Comprueba si existe una palabra con su definición en un Dictionary.
     * @return userL String con todas las palabras genéricas.
     */
    public boolean existDefinition(String word)
    {
        String userL = "";
        Iterator it1 = getDictionary().entrySet().iterator();
        //Si hay al menos un diccionario ingresa.
        if(it1.hasNext())
        {
            Map.Entry e1 = (Map.Entry)it1.next();
            Definition definition = (Definition)e1.getValue();           
            //Se obtiene la definición del primer diccionario.
            //Ahora se itera sobre la definición y se obtiene sus claves.
            Iterator it2 = definition.getDefinition().entrySet().iterator();
            //Mientras haya entradas (tuplas) ingresa.
            while(it2.hasNext())
            {
                //Se obtiene las claves del hashmap (Palabras genéricas).
                Map.Entry e2 = (Map.Entry)it2.next();
                String clave = e2.getKey().toString();
                //Agrega dichas claves a un String.
                userL = userL + clave + ", ";
            }
        }
        //Se quita la última coma.
        userL = userL.substring(0, userL.length() - 2);
        if (userL.contains(word)) return true;
        else return false;       
    }
}